home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 701-725 / 707 / rayshade / raysh4pl6.zoo / libshade / stats.c < prev    next >
C/C++ Source or Header  |  1991-08-08  |  4KB  |  143 lines

  1. /*
  2.  * stats.c
  3.  *
  4.  * Copyright (C) 1989, 1991, Craig E. Kolb
  5.  * All rights reserved.
  6.  *
  7.  * This software may be freely copied, modified, and redistributed
  8.  * provided that this copyright notice is preserved on all copies.
  9.  *
  10.  * You may not distribute this software, in whole or in part, as part of
  11.  * any commercial product without the express consent of the authors.
  12.  *
  13.  * There is no warranty or other guarantee of fitness of this software
  14.  * for any purpose.  It is provided solely "as is".
  15.  *
  16.  * $Id: stats.c,v 4.0 91/07/17 14:47:41 kolb Exp Locker: kolb $
  17.  *
  18.  * $Log:    stats.c,v $
  19.  * Revision 4.0  91/07/17  14:47:41  kolb
  20.  * Initial version.
  21.  * 
  22.  */
  23. #include <ctype.h>
  24. #include "rayshade.h"
  25. #include "options.h"
  26. #include "stats.h"
  27.  
  28. RSStats Stats;            /* Statistical information */
  29. Geom *GeomRep = NULL;    /* Linked list of object representatives */
  30.  
  31. static void PrintGeomStats();
  32.  
  33. void
  34. StatsPrint()
  35. {
  36.     extern void PrintMemoryStats();
  37.     unsigned long TotalRays;
  38.  
  39. #ifndef LINDA
  40.     RSGetCpuTime(&Stats.Utime, &Stats.Stime);
  41. #endif
  42.     ShadowStats(&Stats.ShadowRays, &Stats.ShadowHits,
  43.             &Stats.CacheHits, &Stats.CacheMisses);
  44.     IntersectStats(&Stats.BVTests);
  45.     
  46.     TotalRays = Stats.EyeRays + Stats.ShadowRays + Stats.ReflectRays
  47.              + Stats.RefractRays;
  48.     Stats.ShadowHits += Stats.CacheHits;
  49.     Stats.HitRays += Stats.ShadowHits;
  50. #ifdef LINDA
  51.     fprintf(Stats.fstats,"Workers:\t\t\t%d\n",Options.workers);
  52. #endif
  53.     fprintf(Stats.fstats,"Eye rays:\t\t\t%lu\n", Stats.EyeRays);
  54.     fprintf(Stats.fstats,"Shadow rays:\t\t\t%lu\n",Stats.ShadowRays);
  55.     fprintf(Stats.fstats,"Reflected rays:\t\t\t%lu\n",Stats.ReflectRays);
  56.     fprintf(Stats.fstats,"Refracted rays:\t\t\t%lu\n",Stats.RefractRays);
  57.     fprintf(Stats.fstats,"Total rays:\t\t\t%lu\n", TotalRays);
  58.     if (TotalRays != 0)
  59.         fprintf(Stats.fstats,"Intersecting rays:\t\t%lu (%3.3f%%)\n",
  60.             Stats.HitRays,
  61.             100. * (float)Stats.HitRays / (float)TotalRays);
  62.     if (Stats.ShadowRays != 0) {
  63.         if (Options.cache)
  64.             fprintf(Stats.fstats,
  65.                 "Shadow cache hits:\t\t%lu (%lu misses)\n",
  66.                 Stats.CacheHits, Stats.CacheMisses);
  67.         fprintf(Stats.fstats,"Total shadow hits:\t\t%lu (%3.3f%%)\n",
  68.             Stats.ShadowHits, 100.*(float)Stats.ShadowHits /
  69.             (float)Stats.ShadowRays);
  70.     }
  71.     fprintf(Stats.fstats,"Supersampled pixels:\t\t%lu\n",
  72.         Stats.SuperSampled);
  73.     fprintf(Stats.fstats,"B.V. intersection tests:\t%lu\n",Stats.BVTests);
  74.     PrintGeomStats();
  75. #ifdef LINDA
  76.     fprintf(Stats.fstats,"Average CPU time/processor:\t");
  77. #else
  78.     fprintf(Stats.fstats,"Total CPU time (sec):\t\t");
  79. #endif
  80.     fprintf(Stats.fstats,"%2.2f (%2.2fu + %2.2fs)\n",
  81.         Stats.Utime+Stats.Stime, Stats.Utime, Stats.Stime);
  82.     if (TotalRays != 0.)
  83.         fprintf(Stats.fstats,"Seconds / ray:\t\t\t%4.4f\n",
  84.             (Stats.Utime + Stats.Stime) / (Float)TotalRays);
  85.     if (Stats.HitRays != 0.)
  86.         fprintf(Stats.fstats,"Seconds / intersecting ray:\t%4.4f\n",
  87.             (Stats.Utime + Stats.Stime)/(Float)Stats.HitRays);
  88.     PrintMemoryStats(Stats.fstats);
  89. }
  90.  
  91. static void
  92. PrintGeomStats()
  93. {
  94.     Geom *otmp;
  95.     unsigned long tests, hits, totaltests, totalhits;
  96.     char *name;
  97.     extern void GeomStats();
  98.  
  99.     totaltests = totalhits = 0;
  100.  
  101.     for (otmp = GeomRep; otmp; otmp = otmp->next) {
  102.         GeomStats(otmp, &tests, &hits);
  103.         if (tests <= 0)
  104.             continue;
  105.         name = GeomName(otmp);
  106.         fprintf(Stats.fstats,
  107.             "%c%s intersection tests:\t%lu (%lu hit, %f%%)\n",
  108.                 toupper((int)name[0]), &name[1], tests, hits,
  109.                 100.*(float)hits/(float)tests);
  110.         if (!IsAggregate(otmp)) {
  111.             totaltests += tests;
  112.             totalhits += hits;
  113.         }
  114.     }
  115.     fprintf(Stats.fstats,"Total prim. intersection tests:\t%lu",
  116.         totaltests);
  117.     if (totaltests == 0)
  118.         fprintf(Stats.fstats,"\n");
  119.     else
  120.         fprintf(Stats.fstats," (%lu hit, %f%%)\n", totalhits,
  121.             100.*(float)totalhits/(float)totaltests);
  122. }
  123.  
  124. void
  125. StatsAddRep(obj)
  126. Geom *obj;
  127. {
  128.     Geom *otmp;
  129.  
  130.     for (otmp = GeomRep; otmp; otmp = otmp->next) {
  131.         if (otmp->methods->stats == obj->methods->stats)
  132.             return;
  133.     }
  134.  
  135.     /*
  136.      * Stats method didn't match anything found so far.  Add
  137.      * a copy of obj to head of GeomRep list.
  138.      */
  139.     otmp = GeomCopy(obj);
  140.     otmp->next = GeomRep;
  141.     GeomRep = otmp;
  142. }
  143.